﻿/* PCi AvP Bench Tool - Benchmark automation for AvP 2010 DX11 Demo
   Copyright © 2011, LEGRAND David
   Mail : david@pcinpact.com

   http://code.google.com/p/pci-gbs/

   This file is part of PCi AvP Bench Tool.

   PCi AvP Bench Tool is free software: you can redistribute it and/or modify
   it under the terms of the GNU General Public License as published by
   the Free Software Foundation, either version 3 of the License, or
   (at your option) any later version.

   PCi AvP Bench Tool is distributed in the hope that it will be useful,
   but WITHOUT ANY WARRANTY; without even the implied warranty of
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   GNU General Public License for more details.

   You should have received a copy of the GNU General Public License
   along with PCi AvP Bench Tool.  If not, see <http://www.gnu.org/licenses/>.
 
   You're not allowed to use PC INpact name or logo without permission */

using System;
using System.Diagnostics;
using System.IO;
using System.Text;
using System.Windows.Forms;
using System.Management;
using System.Threading.Tasks;

namespace PCi_AvP_Bench_Tool
{
    public class AvP_Bench
    {

        // Les données publiques
        public string folder;
        public string exe;

        // Les données privées
        private string config = "config.txt";
        private string report = "report.txt";

        // Le bench
        public decimal Bench()
        {
            // Si le répertoire du benchmark existe, on exécute
            if (Directory.Exists(folder))
            {
                // Si il y a déjà un fichier de résultat ou de config, on le supprime
                if (File.Exists(folder + report)) File.Delete(folder + report);
                if (File.Exists(folder + config)) File.Delete(folder + config);

                // On copie le fichier de config désiré
                File.Copy(config, folder + config, true);

                // On configure le processus
                ProcessStartInfo psi = new ProcessStartInfo(folder + exe);
                psi.Arguments = "-config=" + config + " -report=" + report;
                Process p;

                // On lance le test dans une tâche pour éviter de bloquer l'interface
                var tache = Task.Factory.StartNew(() => 
                    {
                        p = Process.Start(psi);
                        p.WaitForExit();
                    });

                tache.Wait();
            }

            // On récupère le résultat
            return Get_FPS();

        }

        private decimal Get_FPS()
        {
            // On place le contenu du fichier de sortie dans un tableau
            string[] r = File.ReadAllLines(folder + report);
            decimal fps = 0;
            // On analyse chaque ligne du tableau
            foreach (string l in r)
            {
                // On teste la longueur de la ligne pour éviter les problèmes
                if (l.Length > 13)
                {
                    // Dès que la bonne ligne est détectée
                    if (l.Substring(0, 13) == "Average FPS: ")
                    {
                        // On remplace les points par des virgules pour que le parse fonctionne
                        decimal.TryParse(l.Substring(13).Replace('.', ','), out fps);
                    }
                }
            }

            return fps;
        }

        public void Write_Config(string w, string h, string parameters)
        {
            // On ouvre le fichier de config et on écrit son contenu
            StreamWriter sw = new StreamWriter(config);

            // On écrit un petit texte d'intro
            sw.WriteLine("# Config file generated by " + Application.ProductName);
            sw.WriteLine("#");
            sw.WriteLine("# Copyright (c) PCINpact.com - LEGRAND David");
            sw.WriteLine("#");
            sw.WriteLine("");

            // on écrit la résolution
            sw.WriteLine("Width: {0}", w);
            sw.WriteLine("Height: {0}", h);

            // On écrit les paramètres de qualité
            sw.WriteLine("Texture Quality: {0}", parameters.Substring(0, 1));
            sw.WriteLine("Shadow Quality: {0}", parameters.Substring(1, 1));
            sw.WriteLine("Anisotropic Filtering: {0}", parameters.Substring(2, 2));
            sw.WriteLine("SSAO: {0}", parameters.Substring(4, 1));

            // La synchro verticale reste toujours à zéro
            sw.WriteLine("Vertical Sync: 0");

            // On écrit les paramètres avancés
            sw.WriteLine("DX11 Tessellation: {0}", parameters.Substring(5, 1));
            sw.WriteLine("DX11 Advanced Shadows: {0}", parameters.Substring(6, 1));
            sw.WriteLine("DX11 MSAA Samples: {0}", parameters.Substring(7, 1));

            sw.Close();

        }
    }
}
